import java.util.Scanner;

public class Demo18 {
    private static int flg=0;
    public static void main(String[] args) {
        Thread t1=new Thread(()->{
            while (flg==0){
                //什么也不做
            }
            System.out.println("t1线程执行结束！");
        });
        Thread t2=new Thread(()->{
            Scanner scanner=new Scanner(System.in);
            flg=scanner.nextInt();
            System.out.println("t2线程执行结束！");
        });
        t1.start();
        t2.start();
        //现在执行代码，看到打印结果为“t2线程执行结束！”，并没有输出"t1线程执行结束！",这是内存可见性问题（由编译器优化所导致）
        //在执行线程1while循环这里，1s，会执行成千上万次，每次flg都是0，并且没有改变，因为这里会进行两个指令load（将内存中的flg值写到寄存器中去），cmp
        //load指令很耗时，这时编译器就会将load指令优化掉，后续就直接从缓存器中去读取flg的值，这时就很省时间，但是在t2中，修改的是内存中flg的值，而我t1中读取的是缓存器中flg的值
        //这就导致t2中修改flg的值，在t1中，无法感知，也就会一直满足循环条件，从而跳不出循环，也就无法执行循环外的语句
    }
}
